Equal tree partition

Time: O(N); Space: O(N); med

Given a binary tree with n nodes, your task is to check if it’s possible to partition the tree to two trees which have the equal sum of values after removing exactly one edge on the original tree.

Example 1:

Input: root = {TreeNode} [5,10,10,None,None,2.3]

  5
 / \
10  10
   /  \
  2    3

Output: True

Explanation:

   5
  /
10

Sum: 15

  10
 /  \
2    3

Sum: 15

Example 2:

Input: root = {TreeNode} [1,2,10,None,None,2.20]

  1
 / \
2   10
   /  \
  2   20

Output: False

Explanation:

  • You can’t split the tree into two trees with equal sum after removing exactly one edge on the tree.

Notes:

  • The range of tree node value is in the range of [-100000, 100000].

  • <= n <= 10000

  • You can assume that the tree is not null

[1]:
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
[2]:
import collections

class Solution1(object):
    def checkEqualTree(self, root) -> bool:
        """
        :type root: TreeNode
        :rtype: bool
        """
        def getSumHelper(node, lookup):
            if not node:
                return 0
            total = node.val + \
                    getSumHelper(node.left, lookup) + \
                    getSumHelper(node.right, lookup)
            lookup[total] += 1
            return total

        lookup = collections.defaultdict(int)
        total = getSumHelper(root, lookup)

        if total == 0:
            return lookup[total] > 1

        return total%2 == 0 and (total//2) in lookup
[3]:
s = Solution1()

root = TreeNode(5)
root.left, root.right = TreeNode(10), TreeNode(10)
root.right.left, root.right.right = TreeNode(2), TreeNode(3)
assert s.checkEqualTree(root) == True

root = TreeNode(1)
root.left, root.right = TreeNode(2), TreeNode(10)
root.right.left, root.right.right = TreeNode(2), TreeNode(20)
assert s.checkEqualTree(root) == False